MOJ MOJ Melhor Online Judge BETA

moj-comp — a CLI do competidor (envie do terminal, sobreviva à queda de Internet)

Faça pelo terminal tudo que a página do contest faz: enviar, ver veredictos, placar e clarifications. A CLI também faz uma coisa que o navegador não faz. Se a Internet cair, a CLI guarda a sua submissão com o horário correto. A submissão conta nesse horário quando a rede voltar.

1. Preparar (faça ANTES da prova)

curl -fsSL https://moj.naquadah.com.br/moj-comp -o ~/.local/bin/moj-comp && chmod +x ~/.local/bin/moj-comp
moj-comp login prova1apc        # o login/senha que a organização te entregou
moj-comp fetch                  # baixa TODOS os enunciados p/ ./prova1apc-prova/ (e os exemplos em samples/)

Requisitos: bash, curl, jq e openssl. Toda máquina de laboratório Linux ou macOS tem esses programas. Não precisa de root. Não precisa instalar nada. A CLI é um arquivo só. O comando de login também aceita a URL da prova (moj-comp login https://prova1apc.moj.naquadah.com.br).

Rode fetch logo depois do login. O fetch salva todos os enunciados no disco (HTML e PDF), em todos os idiomas que a prova oferece: A.html é o português, A.en.html é o inglês. Com os enunciados no disco, você continua trabalhando sem rede.

No login, a CLI recebe a chave pública do contest e mede o seu relógio contra o do servidor. Esses dois dados armam o modo offline (seção 4). O comando moj-comp doctor confere tudo.

2. Enviar e acompanhar

moj-comp problems               # letras, nomes e time-limits
moj-comp submit A sol.c         # envia e ESPERA o veredicto ali mesmo
moj-comp subs                   # todas as suas submissões e veredictos

A linguagem vem da extensão do arquivo (sol.c, sol.cpp, sol.py, Main.java). Para C++, valem .cpp, .cc, .cxx e .c++. O submit espera o veredicto e imprime o resultado. Você não troca de aba. Você não recarrega a página.

3. Placar, dúvidas, avisos

moj-comp score                  # o placar, no terminal
moj-comp clar ask B "A entrada termina com EOF ou com 0?"
moj-comp clar ls                # suas perguntas e as respostas
moj-comp news                   # avisos da organização

4. ☠ Caiu a Internet? Respira. Conta no horário certo.

Em prova, o horário da submissão define a penalidade. Uma queda de rede não pode custar minutos. Quando o submit não alcança o servidor, a CLI entra no modo emergencial sozinha:

$ moj-comp submit C sol.cpp
⚠ SEM REDE — ativando o modo emergencial.
submissão EMPACOTADA offline: C, sol.cpp, carimbo UTC 14:32:07.
ela vale NO HORÁRIO DO CARIMBO quando a rede voltar. Deixe rodando: moj-comp monitor

Depois, deixe o monitor rodando em um terminal. O monitor mostra a fila, tenta reenviar a cada 15 segundos e acompanha os veredictos quando a rede voltar:

$ moj-comp monitor
[14:33:02] rede: OFFLINE · fila: 1 pacote(s)
  1784561527-000.pkt  carimbo 14:32:07 (há 1min)
[14:41:17] rede: ONLINE · fila: 1 pacote(s)
✓ 1784561527-000.pkt ACEITA — contabilizada às 14:32:07 UTC (id 3f9a…)
veredicto: Accepted
  • O horário é confiável por dois motivos. O pacote é cifrado com a chave do contest. O pacote carrega uma âncora de tempo assinada pelo servidor. A organização verifica que a submissão nasceu no horário declarado. O seu relógio pode estar errado: a CLI mede o desvio contra o servidor e carimba o UTC corrigido.
  • Seu código também fica protegido. Em um disco de laboratório, outros usuários não conseguem ler o pacote na fila. Só o servidor abre o pacote.
  • Quando o servidor aceita o pacote, a submissão entra no placar no horário do carimbo. A penalidade é calculada como se a rede não tivesse caído.
Atenção: o carimbo tem de estar dentro da sua janela de prova e depois do seu último contato com o servidor. Um pacote que falha na validação fica guardado em rejeitados/ com o motivo. Mostre esse pacote à organização.

5. ⚡ Comandos rápidos

ComandoO que faz
moj-comp login <id|url>entra no contest (credenciais da organização)
moj-comp fetchbaixa TODOS os enunciados, mais os exemplos de cada problema em samples/<letra>/ (seu seguro anti-queda)
moj-comp samples <letra> [--dir pasta]os exemplos de um problema como arquivos: samples/<letra>/<nome>.in e .out — rode o seu programa neles antes de enviar
moj-comp statement <letra> [--lang en|es]baixa SÓ um enunciado (HTML e PDF, se houver). Sem --lang: todos os idiomas que a prova oferece (A.html, A.en.html). Com um idioma que a prova não oferece, a CLI recusa e lista os disponíveis
moj-comp problems · score · newsproblemas/TLs · placar · avisos
moj-comp submit <letra> <arquivo>envia + espera o veredicto (modo offline entra sozinho)
moj-comp subssuas submissões e veredictos
moj-comp clar ls | ask <letra|geral> <texto>dúvidas p/ a organização
moj-comp outbox · sync · monitorfila offline · reenviar já · VIGIA durante a queda
moj-comp time · doctor · updaterelógio · diagnóstico · auto-atualização (a CLI avisa sozinha quando há versão nova)

6. 💡 Dicas

  • Rode fetch logo após o login. Enunciado no disco sobrevive a qualquer queda.
  • Durante a queda, continue programando e enviando. Cada submit adiciona um pacote carimbado à fila. O monitor entrega todos os pacotes em ordem quando a rede volta.
  • O moj-comp time diz se o seu relógio está errado. Você não precisa de root: a CLI corrige os carimbos sozinha.
  • A prova usa gate de navegador por sede? Rode a CLI na máquina de prova. A CLI lê o User-Agent da imagem da sede em /etc/moj/user-agent e o manda junto da própria marca (moj-comp/build). A CLI passa no gate e divide a chave de máquina com o navegador. De outra máquina, o login dá 403 ua_gate. Isso é intencional. O moj-comp doctor mostra o User-Agent em uso.
  • A página web e a CLI usam a mesma conta. Você pode usar as duas ao mesmo tempo: o navegador para ler, o terminal para enviar.

Manual do competidor (o lado da página web) · Documentação completa